{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1056,
   "id": "3a074666",
   "metadata": {},
   "outputs": [],
   "source": [
    "import keras\n",
    "from scipy.io import loadmat\n",
    "import matplotlib.pyplot as plt\n",
    "import glob\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import math\n",
    "import os\n",
    "from keras.layers import *\n",
    "from keras.models import *\n",
    "from keras.optimizers import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1057,
   "id": "b9bc7624",
   "metadata": {},
   "outputs": [],
   "source": [
    "MANIFEST_DIR = r'C:\\Users\\Administrator\\Desktop\\test\\frftdata\\train\\frfttrain1.0.csv'\n",
    "Batch_size = 30\n",
    "Long = 800\n",
    "Lens = 200\n",
    "def convert2oneHot(index, lens):\n",
    "    hot = np.zeros((lens,))\n",
    "    hot[int(index)] = 1\n",
    "    return(hot)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1058,
   "id": "114df609",
   "metadata": {},
   "outputs": [],
   "source": [
    "def xs_gen(path=MANIFEST_DIR, batch_size=Batch_size, train=True, Lens=Lens):\n",
    "    img_list = pd.read_csv(path)\n",
    "    if train:\n",
    "        img_list = np.array(img_list)[:Lens]\n",
    "        print(\"Found %s train items.\" % len(img_list))\n",
    "        print(\"list 1 is\", img_list[0, -1])\n",
    "        steps = math.ceil(len(img_list) / batch_size)\n",
    "    else:\n",
    "        img_list = np.array(img_list)[Lens:]\n",
    "        print(\"Found %s test items.\" % len(img_list))\n",
    "        print(\"list 1 is\", img_list[0, -1])\n",
    "        steps = math.ceil(len(img_list) / batch_size)\n",
    "    while True:\n",
    "        for i in range(steps):\n",
    "            batch_list = img_list[i * batch_size: i * batch_size + batch_size]\n",
    "            np.random.shuffle(batch_list)\n",
    "            batch_x = np.array([file for file in batch_list[:, 1:-1]])\n",
    "            batch_y = np.array([convert2oneHot(label, 4) for label in batch_list[:, -1]])\n",
    "            yield batch_x, batch_y\n",
    "\n",
    "\n",
    "TEST_MANIFEST_DIR = r'C:\\Users\\Administrator\\Desktop\\test\\frftdata\\test\\frfttest1.0.csv'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1059,
   "id": "09511187",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ts_gen(path=TEST_MANIFEST_DIR, batch_size=Batch_size):\n",
    "    img_list = pd.read_csv(path)\n",
    "    img_list = np.array(img_list)[:Lens]\n",
    "    print(\"Found %s test items.\" % len(img_list))\n",
    "    print(\"list 1 is\", img_list[0, -1])\n",
    "    steps = math.ceil(len(img_list) / batch_size)\n",
    "    while True:\n",
    "        for i in range(steps):\n",
    "            batch_list = img_list[i * batch_size:i * batch_size + batch_size]\n",
    "            batch_x = np.array([file for file in batch_list[:, 1:]])\n",
    "            yield batch_x\n",
    "\n",
    "\n",
    "TIME_PERIODS = 5000\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1060,
   "id": "819a4346",
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_model(input_shape=(TIME_PERIODS,), num_classes=4):\n",
    "    model = Sequential()\n",
    "    model.add(Reshape((TIME_PERIODS, 1), input_shape=input_shape))\n",
    "\n",
    "    model.add(Conv1D(16, 8, strides=2, activation='relu', input_shape=(TIME_PERIODS, 1)))\n",
    "    model.add(Conv1D(16, 8, strides=2, activation='relu', padding=\"same\"))\n",
    "    model.add(MaxPooling1D(2))\n",
    "\n",
    "    model.add(Conv1D(64, 4, strides=2, activation='relu', padding=\"same\"))\n",
    "    model.add(Conv1D(64, 4, strides=2, activation='relu', padding=\"same\"))\n",
    "    model.add(MaxPooling1D(2))\n",
    "\n",
    "    model.add(Conv1D(256, 4, strides=2, activation='relu', padding=\"same\"))\n",
    "    model.add(Conv1D(256, 4, strides=2, activation='relu', padding=\"same\"))\n",
    "    model.add(MaxPooling1D(2))\n",
    "\n",
    "    model.add(Conv1D(512, 2, strides=1, activation='relu', padding=\"same\"))\n",
    "    model.add(Conv1D(512, 2, strides=1, activation='relu', padding=\"same\"))\n",
    "    model.add(MaxPooling1D(2))\n",
    "\n",
    "    \"\"\" model.add(Flatten())\n",
    "    model.add(Dropout(0.3))\n",
    "    model.add(Dense(256, activation='relu'))\"\"\"\n",
    "\n",
    "    model.add(GlobalAveragePooling1D())\n",
    "    model.add(Dropout(0.3))\n",
    "    model.add(Dense(num_classes, activation='softmax'))\n",
    "    return(model)\n",
    "\n",
    "\n",
    "Train = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1061,
   "id": "e3d1b51b",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_81\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "reshape_81 (Reshape)         (None, 5000, 1)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_648 (Conv1D)          (None, 2497, 16)          144       \n",
      "_________________________________________________________________\n",
      "conv1d_649 (Conv1D)          (None, 1249, 16)          2064      \n",
      "_________________________________________________________________\n",
      "max_pooling1d_324 (MaxPoolin (None, 624, 16)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_650 (Conv1D)          (None, 312, 64)           4160      \n",
      "_________________________________________________________________\n",
      "conv1d_651 (Conv1D)          (None, 156, 64)           16448     \n",
      "_________________________________________________________________\n",
      "max_pooling1d_325 (MaxPoolin (None, 78, 64)            0         \n",
      "_________________________________________________________________\n",
      "conv1d_652 (Conv1D)          (None, 39, 256)           65792     \n",
      "_________________________________________________________________\n",
      "conv1d_653 (Conv1D)          (None, 20, 256)           262400    \n",
      "_________________________________________________________________\n",
      "max_pooling1d_326 (MaxPoolin (None, 10, 256)           0         \n",
      "_________________________________________________________________\n",
      "conv1d_654 (Conv1D)          (None, 10, 512)           262656    \n",
      "_________________________________________________________________\n",
      "conv1d_655 (Conv1D)          (None, 10, 512)           524800    \n",
      "_________________________________________________________________\n",
      "max_pooling1d_327 (MaxPoolin (None, 5, 512)            0         \n",
      "_________________________________________________________________\n",
      "global_average_pooling1d_81  (None, 512)               0         \n",
      "_________________________________________________________________\n",
      "dropout_81 (Dropout)         (None, 512)               0         \n",
      "_________________________________________________________________\n",
      "dense_81 (Dense)             (None, 4)                 2052      \n",
      "=================================================================\n",
      "Total params: 1,140,516\n",
      "Trainable params: 1,140,516\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n",
      "Found 200 train items.\n",
      "list 1 is 2.0\n",
      "Epoch 1/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 1.2613 - accuracy: 0.3222Found 600 test items.\n",
      "list 1 is 2.0\n",
      "\n",
      "Epoch 00001: val_loss improved from inf to 1.15947, saving model to best_model.01-1.1595.h5\n",
      "6/6 [==============================] - 3s 428ms/step - loss: 1.2613 - accuracy: 0.3222 - val_loss: 1.1595 - val_accuracy: 0.3250\n",
      "Epoch 2/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 1.0826 - accuracy: 0.4235\n",
      "Epoch 00002: val_loss improved from 1.15947 to 0.98875, saving model to best_model.02-0.9887.h5\n",
      "6/6 [==============================] - 1s 158ms/step - loss: 1.0826 - accuracy: 0.4235 - val_loss: 0.9887 - val_accuracy: 0.7433\n",
      "Epoch 3/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.8793 - accuracy: 0.8176\n",
      "Epoch 00003: val_loss improved from 0.98875 to 0.73116, saving model to best_model.03-0.7312.h5\n",
      "6/6 [==============================] - 1s 155ms/step - loss: 0.8793 - accuracy: 0.8176 - val_loss: 0.7312 - val_accuracy: 0.9883\n",
      "Epoch 4/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.5953 - accuracy: 0.9294\n",
      "Epoch 00004: val_loss improved from 0.73116 to 0.40361, saving model to best_model.04-0.4036.h5\n",
      "6/6 [==============================] - 1s 156ms/step - loss: 0.5953 - accuracy: 0.9294 - val_loss: 0.4036 - val_accuracy: 0.9833\n",
      "Epoch 5/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.3021 - accuracy: 0.9529\n",
      "Epoch 00005: val_loss improved from 0.40361 to 0.18410, saving model to best_model.05-0.1841.h5\n",
      "6/6 [==============================] - 1s 162ms/step - loss: 0.3021 - accuracy: 0.9529 - val_loss: 0.1841 - val_accuracy: 0.9983\n",
      "Epoch 6/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.1742 - accuracy: 0.9647\n",
      "Epoch 00006: val_loss improved from 0.18410 to 0.13241, saving model to best_model.06-0.1324.h5\n",
      "6/6 [==============================] - 1s 157ms/step - loss: 0.1742 - accuracy: 0.9647 - val_loss: 0.1324 - val_accuracy: 0.9733\n",
      "Epoch 7/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.1707 - accuracy: 0.9235\n",
      "Epoch 00007: val_loss improved from 0.13241 to 0.12044, saving model to best_model.07-0.1204.h5\n",
      "6/6 [==============================] - 1s 156ms/step - loss: 0.1707 - accuracy: 0.9235 - val_loss: 0.1204 - val_accuracy: 0.9717\n",
      "Epoch 8/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.2090 - accuracy: 0.9444\n",
      "Epoch 00008: val_loss improved from 0.12044 to 0.03769, saving model to best_model.08-0.0377.h5\n",
      "6/6 [==============================] - 1s 160ms/step - loss: 0.2090 - accuracy: 0.9444 - val_loss: 0.0377 - val_accuracy: 1.0000\n",
      "Epoch 9/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.2685 - accuracy: 0.8941\n",
      "Epoch 00009: val_loss did not improve from 0.03769\n",
      "6/6 [==============================] - 1s 156ms/step - loss: 0.2685 - accuracy: 0.8941 - val_loss: 0.2362 - val_accuracy: 0.8667\n",
      "Epoch 10/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.1131 - accuracy: 0.9529\n",
      "Epoch 00010: val_loss did not improve from 0.03769\n",
      "6/6 [==============================] - 1s 146ms/step - loss: 0.1131 - accuracy: 0.9529 - val_loss: 0.1002 - val_accuracy: 0.9817\n",
      "Epoch 11/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.1316 - accuracy: 0.9765\n",
      "Epoch 00011: val_loss did not improve from 0.03769\n",
      "6/6 [==============================] - 1s 167ms/step - loss: 0.1316 - accuracy: 0.9765 - val_loss: 0.0408 - val_accuracy: 0.9983\n",
      "Epoch 12/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0447 - accuracy: 0.9941\n",
      "Epoch 00012: val_loss improved from 0.03769 to 0.02581, saving model to best_model.12-0.0258.h5\n",
      "6/6 [==============================] - 1s 152ms/step - loss: 0.0447 - accuracy: 0.9941 - val_loss: 0.0258 - val_accuracy: 1.0000\n",
      "Epoch 13/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0331 - accuracy: 0.9941\n",
      "Epoch 00013: val_loss did not improve from 0.02581\n",
      "6/6 [==============================] - 1s 148ms/step - loss: 0.0331 - accuracy: 0.9941 - val_loss: 0.0375 - val_accuracy: 0.9983\n",
      "Epoch 14/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0303 - accuracy: 1.0000\n",
      "Epoch 00014: val_loss improved from 0.02581 to 0.01876, saving model to best_model.14-0.0188.h5\n",
      "6/6 [==============================] - 1s 155ms/step - loss: 0.0303 - accuracy: 1.0000 - val_loss: 0.0188 - val_accuracy: 1.0000\n",
      "Epoch 15/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0148 - accuracy: 1.0000\n",
      "Epoch 00015: val_loss improved from 0.01876 to 0.00910, saving model to best_model.15-0.0091.h5\n",
      "6/6 [==============================] - 1s 161ms/step - loss: 0.0148 - accuracy: 1.0000 - val_loss: 0.0091 - val_accuracy: 1.0000\n",
      "Epoch 16/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0085 - accuracy: 1.0000\n",
      "Epoch 00016: val_loss improved from 0.00910 to 0.00602, saving model to best_model.16-0.0060.h5\n",
      "6/6 [==============================] - 1s 166ms/step - loss: 0.0085 - accuracy: 1.0000 - val_loss: 0.0060 - val_accuracy: 1.0000\n",
      "Epoch 17/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0057 - accuracy: 1.0000\n",
      "Epoch 00017: val_loss improved from 0.00602 to 0.00494, saving model to best_model.17-0.0049.h5\n",
      "6/6 [==============================] - 1s 156ms/step - loss: 0.0057 - accuracy: 1.0000 - val_loss: 0.0049 - val_accuracy: 1.0000\n",
      "Epoch 18/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0039 - accuracy: 1.0000\n",
      "Epoch 00018: val_loss improved from 0.00494 to 0.00417, saving model to best_model.18-0.0042.h5\n",
      "6/6 [==============================] - 1s 161ms/step - loss: 0.0039 - accuracy: 1.0000 - val_loss: 0.0042 - val_accuracy: 1.0000\n",
      "Epoch 19/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0046 - accuracy: 1.0000\n",
      "Epoch 00019: val_loss improved from 0.00417 to 0.00323, saving model to best_model.19-0.0032.h5\n",
      "6/6 [==============================] - 1s 156ms/step - loss: 0.0046 - accuracy: 1.0000 - val_loss: 0.0032 - val_accuracy: 1.0000\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 20/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0027 - accuracy: 1.0000\n",
      "Epoch 00020: val_loss improved from 0.00323 to 0.00261, saving model to best_model.20-0.0026.h5\n",
      "6/6 [==============================] - 1s 159ms/step - loss: 0.0027 - accuracy: 1.0000 - val_loss: 0.0026 - val_accuracy: 1.0000\n",
      "Epoch 21/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0029 - accuracy: 1.0000\n",
      "Epoch 00021: val_loss improved from 0.00261 to 0.00223, saving model to best_model.21-0.0022.h5\n",
      "6/6 [==============================] - 1s 155ms/step - loss: 0.0029 - accuracy: 1.0000 - val_loss: 0.0022 - val_accuracy: 1.0000\n",
      "Epoch 22/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0024 - accuracy: 1.0000\n",
      "Epoch 00022: val_loss improved from 0.00223 to 0.00201, saving model to best_model.22-0.0020.h5\n",
      "6/6 [==============================] - 1s 166ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.0020 - val_accuracy: 1.0000\n",
      "Epoch 23/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0030 - accuracy: 1.0000\n",
      "Epoch 00023: val_loss improved from 0.00201 to 0.00182, saving model to best_model.23-0.0018.h5\n",
      "6/6 [==============================] - 1s 166ms/step - loss: 0.0030 - accuracy: 1.0000 - val_loss: 0.0018 - val_accuracy: 1.0000\n",
      "Epoch 24/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0020 - accuracy: 1.0000\n",
      "Epoch 00024: val_loss improved from 0.00182 to 0.00163, saving model to best_model.24-0.0016.h5\n",
      "6/6 [==============================] - 1s 157ms/step - loss: 0.0020 - accuracy: 1.0000 - val_loss: 0.0016 - val_accuracy: 1.0000\n",
      "Epoch 25/25\n",
      "6/6 [==============================] - ETA: 0s - loss: 0.0020 - accuracy: 1.0000\n",
      "Epoch 00025: val_loss improved from 0.00163 to 0.00139, saving model to best_model.25-0.0014.h5\n",
      "6/6 [==============================] - 1s 157ms/step - loss: 0.0020 - accuracy: 1.0000 - val_loss: 0.0014 - val_accuracy: 1.0000\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\n",
    "    if Train == True:\n",
    "        train_iter = xs_gen()\n",
    "        val_iter = xs_gen(train=False)\n",
    "\n",
    "        ckpt = keras.callbacks.ModelCheckpoint(\n",
    "            filepath='best_model.{epoch:02d}-{val_loss:.4f}.h5',\n",
    "            monitor='val_loss', save_best_only=True, verbose=1\n",
    "        )\n",
    "\n",
    "        model = build_model()\n",
    "        opt = Adam(0.0002)\n",
    "        model.compile(loss='categorical_crossentropy',\n",
    "                      optimizer = opt, metrics=['accuracy'])\n",
    "        print(model.summary())\n",
    "\n",
    "        train_history = model.fit_generator(\n",
    "            generator=train_iter,\n",
    "            steps_per_epoch=Lens // Batch_size,\n",
    "            epochs=25,\n",
    "            initial_epoch=0,\n",
    "            validation_data=val_iter,\n",
    "            validation_steps=(Long - Lens) // Batch_size,\n",
    "            callbacks=[ckpt],\n",
    "        )\n",
    "\n",
    "        model.save(\"finishModel.h5\")\n",
    "    else:\n",
    "        test_iter = ts_gen()\n",
    "        model = load_model(\"best_model.49-0.00.h5\")\n",
    "        pres = model.predict_generator(generator=test_iter, steps=math.ceil(528 / Batch_size), verbose=1)\n",
    "        print(pres.shape)\n",
    "        ohpres = np.argmax(pres, axis=1)\n",
    "        print(ohpres.shape)\n",
    "        df = pd.DataFrame()\n",
    "        df[\"id\"] = np.arange(1, len(ohpres) + 1)\n",
    "        df[\"label\"] = ohpres\n",
    "        df.to_csv(\"predicts.csv\", index=None)\n",
    "        test_iter = ts_gen()\n",
    "        for x in test_iter:\n",
    "            x1 = x[0]\n",
    "            break\n",
    "        plt.plot(x1)\n",
    "        plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1062,
   "id": "e585117c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def show_train_history(train_history, train, validation):\n",
    "    plt.plot(train_history.history[train])\n",
    "    plt.plot(train_history.history[validation])\n",
    "    plt.ylabel('Train History')\n",
    "    plt.ylabel(train)\n",
    "    plt.xlabel('Epoch')\n",
    "    plt.legend(['train', 'validation'], loc='upper left')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1063,
   "id": "435e7c5d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_train_history(train_history, 'accuracy', 'val_accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1064,
   "id": "d7e34dcc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_train_history(train_history, 'loss', 'val_loss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1065,
   "id": "539fbd59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.figure(figsize=(6, 4))\n",
    "plt.plot(train_history.history['accuracy'], \"g--\", label=\"训练集准确率\")\n",
    "plt.plot(train_history.history['val_accuracy'], \"g\", label=\"验证集准确率\")\n",
    "plt.plot(train_history.history['loss'], \"r--\", label=\"训练集损失函数\")\n",
    "plt.plot(train_history.history['val_loss'], \"r\", label=\"验证集损失函数\")\n",
    "plt.title('模型的准确率和损失函数', fontsize=14)\n",
    "plt.ylabel('准确率和损失函数', fontsize=12)\n",
    "plt.xlabel('世代数', fontsize=12)\n",
    "plt.ylim(0)\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1066,
   "id": "3cc53ef0",
   "metadata": {},
   "outputs": [],
   "source": [
    "testdata = train_history.history['val_accuracy']\n",
    "df = pd.DataFrame(testdata)\n",
    "df.to_csv(r'C:\\Users\\Administrator\\Desktop\\daochu.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1114,
   "id": "d7d35063",
   "metadata": {},
   "outputs": [],
   "source": [
    "file = r\"C:\\Users\\Administrator\\Desktop\\shiyong22.csv\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1115,
   "id": "52438f08",
   "metadata": {},
   "outputs": [],
   "source": [
    "all_df = pd.read_csv(file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1116,
   "id": "9e93ed74",
   "metadata": {},
   "outputs": [],
   "source": [
    "ndarray = all_df.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1117,
   "id": "ef8e195d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [1]], dtype=int64)"
      ]
     },
     "execution_count": 1117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ndarray[:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1118,
   "id": "cc3afe50",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 200 test items.\n",
      "list 1 is 2.018626134\n",
      "18/18 [==============================] - 0s 17ms/step\n",
      "(520, 4)\n"
     ]
    }
   ],
   "source": [
    "test_iter = ts_gen()\n",
    "pres = model.predict_generator(generator=test_iter, steps=math.ceil(520 / Batch_size), verbose=1)\n",
    "print(pres.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1119,
   "id": "8ad71082",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(200, 1)\n"
     ]
    }
   ],
   "source": [
    "print(ndarray.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1120,
   "id": "4ab17093",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(520,)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0, 0, 1, 1, 0, 0, 1, 1, 1, 3, 0, 3, 0, 1, 0, 0, 3, 3, 2, 1, 2, 3,\n",
       "       3, 2, 0, 2, 2, 1, 3, 2, 3, 1, 2, 3, 0, 2, 3, 2, 1, 0, 1, 0, 0, 2,\n",
       "       3, 3, 1, 2, 1, 1, 3, 0, 2, 1, 2, 1, 3, 2, 3, 1, 2, 3, 1, 0, 0, 2,\n",
       "       2, 2, 2, 2, 0, 1, 0, 3, 2, 2, 3, 1, 3, 1, 3, 1, 0, 3, 1, 0, 3, 1,\n",
       "       3, 2, 2, 0, 1, 3, 3, 2, 3, 3, 2, 2, 2, 2, 3, 1, 2, 0, 0, 0, 0, 2,\n",
       "       2, 0, 0, 2, 1, 3, 3, 1, 0, 2, 1, 0, 0, 0, 1, 3, 0, 2, 1, 1, 0, 1,\n",
       "       0, 1, 3, 2, 3, 2, 3, 0, 0, 1, 3, 3, 1, 2, 0, 3, 3, 0, 3, 0, 2, 1,\n",
       "       1, 3, 1, 2, 0, 1, 1, 0, 0, 0, 1, 3, 0, 2, 1, 1, 0, 1, 0, 1, 3, 2,\n",
       "       3, 2, 3, 0, 0, 1, 3, 3, 1, 2, 0, 3, 3, 0, 3, 0, 2, 1, 1, 3, 1, 2,\n",
       "       0, 1], dtype=int64)"
      ]
     },
     "execution_count": 1120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ohpres = np.argmax(pres, axis=1)\n",
    "print(ohpres.shape)\n",
    "ohpres=ohpres[:200]\n",
    "ohpres"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1121,
   "id": "39050f76",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import confusion_matrix\n",
    "import numpy as np\n",
    "\n",
    "def cm_plot(original_label, predict_label, pic=None):\n",
    "    cm = confusion_matrix(original_label, predict_label)\n",
    "    plt.figure()\n",
    "    plt.matshow(cm, cmap=plt.cm.GnBu)\n",
    "    plt.colorbar()\n",
    "    for x in range(len(cm)):\n",
    "        for y in range(len(cm)):\n",
    "            plt.annotate(cm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')\n",
    "    plt.ylabel('Predicted label')\n",
    "    plt.xlabel('True label')\n",
    "    plt.title('Confusion Matrix')\n",
    "    if pic is not None:\n",
    "        plt.savefig(str(pic) + '.jpg')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1122,
   "id": "3e49ec90",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = 'SimHei'\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "cm_plot(ndarray, ohpres)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1104,
   "id": "42188093",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.96"
      ]
     },
     "execution_count": 1104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_score(ndarray, ohpres)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1034,
   "id": "b1deedcf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1.3808166980743408,\n",
       " 1.3577184677124023,\n",
       " 1.2972100973129272,\n",
       " 1.216436505317688,\n",
       " 1.1809911727905273,\n",
       " 1.132028341293335,\n",
       " 1.0613418817520142,\n",
       " 0.9857239723205566,\n",
       " 0.835960865020752,\n",
       " 0.780597984790802,\n",
       " 0.6921771764755249,\n",
       " 0.651037871837616,\n",
       " 0.5477163195610046,\n",
       " 0.5168696045875549,\n",
       " 0.4617786705493927,\n",
       " 0.4813087582588196,\n",
       " 0.4515032172203064,\n",
       " 0.4019736349582672,\n",
       " 0.35730981826782227,\n",
       " 0.3141750991344452,\n",
       " 0.39422404766082764,\n",
       " 0.400638610124588,\n",
       " 0.4012707471847534,\n",
       " 0.33461132645606995,\n",
       " 0.3260943591594696]"
      ]
     },
     "execution_count": 1034,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_history.history['loss']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 711,
   "id": "54dcafaf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[4.414752006530762,\n",
       " 1.4087058305740356,\n",
       " 1.3884167671203613,\n",
       " 1.3898876905441284,\n",
       " 1.3898757696151733,\n",
       " 1.389997124671936,\n",
       " 1.3876137733459473,\n",
       " 1.388262391090393,\n",
       " 1.388336181640625,\n",
       " 1.38800847530365,\n",
       " 1.388262391090393,\n",
       " 1.3875138759613037,\n",
       " 1.3881995677947998,\n",
       " 1.3891583681106567,\n",
       " 1.3886951208114624,\n",
       " 1.387660264968872,\n",
       " 1.387418508529663,\n",
       " 1.3875999450683594,\n",
       " 1.3876866102218628,\n",
       " 1.3884252309799194,\n",
       " 1.388853669166565,\n",
       " 1.388655662536621,\n",
       " 1.3883846998214722,\n",
       " 1.38779878616333,\n",
       " 1.3875389099121094]"
      ]
     },
     "execution_count": 711,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_history.history['val_loss']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 712,
   "id": "39e8da16",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.25,\n",
       " 0.2516666650772095,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158,\n",
       " 0.24500000476837158]"
      ]
     },
     "execution_count": 712,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_history.history['val_accuracy']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 713,
   "id": "59ddefb5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.23333333432674408,\n",
       " 0.29411765933036804,\n",
       " 0.23529411852359772,\n",
       " 0.24705882370471954,\n",
       " 0.25294119119644165,\n",
       " 0.30588236451148987,\n",
       " 0.24705882370471954,\n",
       " 0.2666666805744171,\n",
       " 0.25294119119644165,\n",
       " 0.25294119119644165,\n",
       " 0.30000001192092896,\n",
       " 0.23529411852359772,\n",
       " 0.29411765933036804,\n",
       " 0.25294119119644165,\n",
       " 0.28333333134651184,\n",
       " 0.25882354378700256,\n",
       " 0.29411765933036804,\n",
       " 0.20588235557079315,\n",
       " 0.2823529541492462,\n",
       " 0.33529412746429443,\n",
       " 0.25294119119644165,\n",
       " 0.30000001192092896,\n",
       " 0.24117647111415863,\n",
       " 0.24117647111415863,\n",
       " 0.2647058963775635]"
      ]
     },
     "execution_count": 713,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_history.history['accuracy']"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "无",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
